S3 で特定の IAM ユーザーと IAM ロールからのアクセスのみに制限するバケットポリシーを教えてください
困っていた内容
S3 バケットに対して、ある特定の IAM ユーザーと IAM ロールからのアクセスのみを許可し、それ以外からのアクセスを拒否したい要件があります。 これを実現できるバケットポリシーを教えてください。
どう対応すればいいの?
下記のバケットポリシーで実現できます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "NotPrincipal": { "AWS": "arn:aws:iam::[アカウントID]:user/[IAMユーザー名]" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::[バケット名]", "arn:aws:s3:::[バケット名]/*" ], "Condition": { "StringNotLike": { "aws:userId": [ "[IAMロールのロールID]:*" ] } } } ] }
※ Condition句に記述する IAM ロールのロールIDは、下記コマンドを実行した出力結果の RoleId
で確認できます。
aws iam get-role --role-name [IAMロール名]
補足
このような「バケットポリシーで、ある特定の IAM ユーザーと IAM ロール、両方からのアクセスのみを許可したい」という要件はよくあると思います。
しかしながら上記のように「IAM ユーザーは NotPrincipal 句でARNを指定し、IAM ロールは RoleId を調べて Condition 句でIDを指定する」という違いがあるのは意外と盲点で、この両方を満たせる設定例がドキュメント等にも見当たらなかったため、備忘として記事にしました。
この情報がどなたかのお役に立てば幸いです!
参考資料
- [1] get-role — AWS CLI 1.29.79 Command Reference
- [2] バケット所有者がユーザーにバケットのアクセス許可を付与する - Amazon Simple Storage Service
- [3] 特定の IAM ロールのみアクセスできる S3 バケットを実装する際に検討したあれこれ | DevelopersIO
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。